package com.harzone.commons.search.service;

import java.io.Closeable;
import java.sql.SQLException;
import java.util.List;

import com.harzone.commons.search.result.RowMapper;
import com.harzone.commons.search.result.ScanRowMapper;
import com.harzone.commons.search.result.SearchResult;
import com.harzone.commons.search.result.SearchResultSet;
import com.harzone.commons.search.statement.Delete;
import com.harzone.commons.search.statement.Insert;
import com.harzone.commons.search.statement.Select;
import com.harzone.commons.search.statement.Update;

/**
 * 搜查服务接口
 * @author ls
 * 2014年11月21日上午11:45:45
 */
public interface SearchService extends Closeable{

	
	
	/**
	 * 打开服务
	 * @author ls
	 * 2014年11月21日下午3:24:08 
	 * @param address
	 * @return
	 */
	public boolean open(String address);
	
	
	/**
	 * 
	 * @author ls
	 * 2014年11月21日下午3:24:11 
	 * @return
	 */
	public boolean open();
	
	
	/**
	 * 重新打开服务
	 * @author ls
	 * 2014年11月21日下午3:24:21 
	 * @return
	 */
	public boolean reopen();
	
	
	/**
	 * 提交(默认为硬提交)
	 * @author ls
	 * 2014年11月21日下午3:24:23 
	 * @return
	 */
	public boolean commit();
	
	
	/**
	 * 
	 * @param softCommit
	 * @return
	 * @author ls
	 * 2014年11月28日下午8:53:51
	 */
	public boolean commit(boolean softCommit);
	
	
	/**
	 * 回滚
	 * @author ls
	 * 2014年11月21日下午3:24:28 
	 * @return
	 */
	public boolean rollback();
	
	
	/**
	 * 添加(需要判断是否存在)
	 * @author ls
	 * 2014年11月21日下午3:24:33 
	 * @param insert
	 * @return
	 */
	public boolean insert(Insert insert);
	
	
	/**
	 * 添加
	 * @author ls
	 * 2014年11月21日下午6:02:52 
	 * @param insert
	 * @param checkExist 是否检查存在性
	 * @return
	 */
	public boolean insert(Insert insert, boolean checkExist);
	
	
	/**
	 * 删除
	 * @author ls
	 * 2014年11月21日下午3:24:36 
	 * @param delete
	 * @return
	 */
	public boolean delete(Delete delete);
	
	
	/**
	 * 修改
	 * @author ls
	 * 2014年11月21日下午3:24:43 
	 * @param update
	 * @return
	 */
	public boolean update(Update update);
	
	
	/**
	 * 修改
	 * @author ls
	 * 2014年11月25日下午3:58:10 
	 * @param update
	 * @param checkExist
	 * @return
	 */
	public boolean update(Update update, boolean checkExist);
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月21日下午3:25:52 
	 * @param select
	 * @return
	 */
	public SearchResult search(Select select);
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月25日上午11:13:45 
	 * @param select
	 * @return
	 */
	public SearchResultSet executeQuery(Select select);
	
	/**
	 * 统计数量
	 * @author ls
	 * 2014年11月21日下午6:01:50 
	 * @param sql
	 * @return
	 * @throws SQLException 
	 */
	public int executeQueryForInt(final Select select) throws SQLException;
	
	
	/**
	 * 执行更新操作(添加、删除、修改)
	 * @author ls
	 * 2014年11月21日下午6:01:41 
	 * @param sql
	 * @return 
	 */
	public boolean execute(final String sql);
	
	
	/**
	 * 执行更新操作(添加、删除、修改)
	 * @author ls
	 * 2014年11月21日下午6:03:25 
	 * @param sql
	 * @param checkExist 是否检查存在性
	 * @return 
	 */
	public boolean execute(final String sql, boolean checkExist);
	
	
	/**
	 * 统计数量
	 * @author ls
	 * 2014年11月21日下午6:01:50 
	 * @param sql
	 * @return
	 * @throws SQLException 
	 */
	public int executeQueryForInt(final String sql) throws SQLException;
	
	
	/**
	 * 查询
	 * @author ls
	 * 2014年11月21日下午6:02:08 
	 * @param sql
	 * @return
	 */
	public SearchResult executeQuery(final String sql);
	
	

	/**
	 * 查询
	 * @author ls
	 * 2014年11月25日上午11:13:37 
	 * @param select
	 * @param rowMapper
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> executeQuery(Select select, RowMapper<T> rowMapper) throws SQLException;
	
	
	/**
	 * 遍历数据
	 * @author ls
	 * 2014年11月25日下午6:01:06 
	 * @param select
	 * @param rowMapper
	 * @return
	 * @throws SQLException
	 */
	public <T> void scan(Select select, ScanRowMapper<T> rowMapper) throws SQLException;
	
	
	/**
	 * 关闭服务
	 * @author ls
	 * 2014年11月21日下午3:23:55
	 */
	public void close();
	
	
	/**
	 * 服务是否关闭
	 * @author ls
	 * 2014年11月21日下午3:24:00 
	 * @return
	 */
	public boolean isClosed();
	
	
	/**
	 * 是否自动提交
	 * @author ls
	 * 2014年11月25日下午5:27:16 
	 * @return
	 */
	public boolean isAutoCommit();
	
	/**
	 * 获取服务地址信息
	 * @author ls
	 * 2014年11月21日下午3:24:05 
	 * @return
	 */
	public String getAddress();

}
